package com.rachel.studyapp.utils;

import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.content.FileProvider;
import android.util.Log;

import com.rachel.studyapp.fragment.MineFragment;

import java.io.File;
import java.io.IOException;

/**
 * Created by zhengshaorui on 2017/8/25.
 */

public class BitmapUtils {
    private static final String TAG = "zsr";
    public static String UriTranslationPath(Context context, Uri uri){

        // 从Android4.4开始，uri返回来的数据是会进行另一层封装的，所以需要特殊处理
        String path = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            Log.d(TAG, "UriTranslationPath: "+uri.getScheme()+" "+uri.getAuthority());
            //如果返回的是 document 类型
            if (DocumentsContract.isDocumentUri(context,uri)){
                //则通过 document id  来处理
                String docId = DocumentsContract.getDocumentId(uri);
                if (uri.getAuthority().equals("com.android.providers.media.documents")){
                    Log.d(TAG, "UriTranslationPath: "+docId);
                    String id = docId.split(":")[1]; //解析出数字id
                    String selection = MediaStore.Images.Media._ID + "=" + id;
                    path = getImagePath(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
                }else if(uri.getAuthority().equals("com.android.providers.downloads.documents")){
                    //如果是download下的document
                    Uri contenturi = ContentUris.withAppendedId(
                            uri.parse("content://download/public_downloads"),Long.valueOf(docId));
                    path = getImagePath(context,contenturi,null);

                }
            }else if (uri.getScheme().equalsIgnoreCase("content")){
                //如果是 content类型，用普通方式
                path = getImagePath(context,uri,null);
            }else if(uri.getScheme().equalsIgnoreCase("file")){
                //如果是 file 类型，则直接取
                path = uri.getPath();
            }
            return path;
        }
        return null;
    }


    public static String getImagePath(Context context,Uri uri,String selection){
        String path = null;
        Cursor cursor = context.getContentResolver().query(uri,null,selection,null,null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                return path;
            }
            cursor.close();
        }
        return path;
    }


    /**
     * 打开相册
     */
    public static void openCamera(Context context, MineFragment fragment) {
        //创建一个file，用来存储拍照后的照片
        File outputfile = new File(context.getExternalCacheDir(),"output.png");
        try {
            if (outputfile.exists()){
                outputfile.delete();//删除
            }
            outputfile.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Uri imageuri ;
        if (Build.VERSION.SDK_INT >= 24){
            imageuri = FileProvider.getUriForFile(context,
                    "com.rachel.studyapp.fileprovider", //可以是任意字符串
                    outputfile);
        }else{
            imageuri = Uri.fromFile(outputfile);
        }

        //启动相机程序
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
        fragment.startActivityForResult(intent,ToolUtils.PHONE_CAMERA);
    }


    /**
     * 图片裁剪
     * @param uri
     * @param fragment
     * @return
     */
    @NonNull
    public static Uri CutForPhoto(Uri uri, Context context, MineFragment fragment) {
        try {
            //直接裁剪
            Intent intent = new Intent("com.android.camera.action.CROP");


            //设置裁剪之后的图片路径文件
            File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
                    "cutcamera.png"); //随便命名一个

            if (cutfile.exists()){ //如果已经存在，则先删除,这里应该是上传到服务器，然后再删除本地的，没服务器，只能这样了
                cutfile.delete();
            }
            cutfile.createNewFile();

            //初始化 uri
            Uri imageUri = uri; //返回来的 uri
            Uri outputUri = null; //真实的 uri
            // Log.d(TAG, "CutForPhoto: "+cutfile);
            outputUri = Uri.fromFile(cutfile);



            // crop为true是设置在开启的intent中设置显示的view可以剪裁
            intent.putExtra("crop",true);
            // aspectX,aspectY 是宽高的比例，这里设置正方形
            intent.putExtra("aspectX",1);
            intent.putExtra("aspectY",1);
            //设置要裁剪的宽高
            intent.putExtra("outputX", ToolUtils.dip2px(context,200)); //200dp
            intent.putExtra("outputY",ToolUtils.dip2px(context,200));

            intent.putExtra("scale",true);

            //如果图片过大，会导致oom，这里设置为false
            intent.putExtra("return-data",false);
            if (imageUri != null) {
                intent.setDataAndType(imageUri, "image/*");
            }
            if (outputUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
            }
            intent.putExtra("noFaceDetection", true);
            //压缩图片
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            fragment.startActivityForResult(intent,ToolUtils.PHONE_CROP);
            return outputUri;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 拍照之后，启动裁剪
     * @return
     */
    @NonNull
    public static  Uri CutForCamera(Context context,MineFragment fragment) {
        try {

            //设置裁剪之后的图片路径文件
            File cutfile = new File(Environment.getExternalStorageDirectory().getPath(),
                    "cutcamera.png"); //随便命名一个

            if (cutfile.exists()){ //如果已经存在，则先删除,这里应该是上传到服务器，然后再删除本地的，没服务器，只能这样了
                cutfile.delete();
            }
            cutfile.createNewFile();

            //初始化 uri
            Uri imageUri = null; //返回来的 uri
            Uri outputUri = null; //真实的 uri


            Intent intent = new Intent("com.android.camera.action.CROP");


            //拍照留下的图片
            File camerafile = new File(context.getExternalCacheDir(),"output.png");

            if (Build.VERSION.SDK_INT >= 24) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                imageUri = FileProvider.getUriForFile(context,
                        "com.rachel.studyapp.fileprovider",
                        camerafile);

            } else {
                imageUri = Uri.fromFile(camerafile);

            }

            outputUri = Uri.fromFile(cutfile);



            // crop为true是设置在开启的intent中设置显示的view可以剪裁
            intent.putExtra("crop",true);
            // aspectX,aspectY 是宽高的比例，这里设置正方形
            intent.putExtra("aspectX",1);
            intent.putExtra("aspectY",1);
            //设置要裁剪的宽高
            intent.putExtra("outputX", ToolUtils.dip2px(context,200));
            intent.putExtra("outputY",ToolUtils.dip2px(context,200));

            intent.putExtra("scale",true);

            //如果图片过大，会导致oom，这里设置为false
            intent.putExtra("return-data",false);
            if (imageUri != null) {
                intent.setDataAndType(imageUri, "image/*");
            }

            if (outputUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
            }
            intent.putExtra("noFaceDetection", true);
            //压缩图片
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            fragment.startActivityForResult(intent,ToolUtils.PHONE_CROP);
            return outputUri;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}
